package com.scheduling.inventory.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.scheduling.inventory.dto.ProductInventoryDTO;
import com.scheduling.inventory.dto.ProductInventoryQueryDTO;
import com.scheduling.inventory.entity.ProductInventory;

import java.math.BigDecimal;
import java.util.List;

/**
 * 产品库存Service接口
 *
 * @author 开发团队
 * @since 2025-05-29
 */
public interface ProductInventoryService extends IService<ProductInventory> {

    /**
     * 分页查询产品库存
     *
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<ProductInventoryDTO> getInventoryPage(ProductInventoryQueryDTO queryDTO);

    /**
     * 根据库存ID获取库存信息
     *
     * @param inventoryId 库存ID
     * @return 库存信息
     */
    ProductInventoryDTO getInventoryById(String inventoryId);

    /**
     * 根据产品ID获取库存信息
     *
     * @param productId 产品ID
     * @return 库存信息
     */
    ProductInventoryDTO getInventoryByProductId(String productId);

    /**
     * 新增产品库存
     *
     * @param inventoryDTO 库存信息
     * @return 操作结果
     */
    boolean createInventory(ProductInventoryDTO inventoryDTO);

    /**
     * 更新产品库存
     *
     * @param inventoryDTO 库存信息
     * @return 操作结果
     */
    boolean updateInventory(ProductInventoryDTO inventoryDTO);

    /**
     * 删除产品库存
     *
     * @param inventoryId 库存ID
     * @return 操作结果
     */
    boolean deleteInventory(String inventoryId);

    /**
     * 批量删除产品库存
     *
     * @param inventoryIds 库存ID列表
     * @return 操作结果
     */
    boolean batchDeleteInventory(List<String> inventoryIds);

    /**
     * 更新在制品数量
     *
     * @param productId   产品ID
     * @param wipQuantity 在制品数量
     * @param reason      更新原因
     * @return 操作结果
     */
    boolean updateWipQuantity(String productId, BigDecimal wipQuantity, String reason);

    /**
     * 更新完成品数量
     *
     * @param productId        产品ID
     * @param finishedQuantity 完成品数量
     * @param reason           更新原因
     * @return 操作结果
     */
    boolean updateFinishedQuantity(String productId, BigDecimal finishedQuantity, String reason);

    /**
     * 从在制品转为完成品
     *
     * @param productId 产品ID
     * @param quantity  转换数量
     * @param reason    转换原因
     * @return 操作结果
     */
    boolean transferWipToFinished(String productId, BigDecimal quantity, String reason);

    /**
     * 投入生产（增加在制品数量）
     *
     * @param productId 产品ID
     * @param quantity  投入数量
     * @param reason    投入原因
     * @return 操作结果
     */
    boolean addToWip(String productId, BigDecimal quantity, String reason);

    /**
     * 完成生产（从在制品转为完成品）
     *
     * @param productId 产品ID
     * @param quantity  完成数量
     * @param reason    完成原因
     * @return 操作结果
     */
    boolean completeProduction(String productId, BigDecimal quantity, String reason);

    /**
     * 出库（减少完成品数量）
     *
     * @param productId 产品ID
     * @param quantity  出库数量
     * @param reason    出库原因
     * @return 操作结果
     */
    boolean shipProduct(String productId, BigDecimal quantity, String reason);

    /**
     * 获取库存汇总信息
     *
     * @return 库存汇总列表
     */
    List<ProductInventoryDTO> getInventorySummary();

    /**
     * 检查完成品库存是否充足
     *
     * @param productId        产品ID
     * @param requiredQuantity 所需数量
     * @return 操作结果
     */
    boolean checkFinishedInventorySufficient(String productId, BigDecimal requiredQuantity);

    /**
     * 减少在制品数量
     *
     * @param productId 产品ID
     * @param amount    减少数量
     * @param reason    减少原因
     * @return 操作结果
     */
    boolean decreaseWipQuantity(String productId, BigDecimal amount, String reason);

    /**
     * 增加完成品数量
     *
     * @param productId 产品ID
     * @param amount    增加数量
     * @param reason    增加原因
     * @return 操作结果
     */
    boolean increaseFinishedQuantity(String productId, BigDecimal amount, String reason);

    /**
     * 减少完成品数量
     *
     * @param productId 产品ID
     * @param amount    减少数量
     * @param reason    减少原因
     * @return 操作结果
     */
    boolean decreaseFinishedQuantity(String productId, BigDecimal amount, String reason);
} 